package com.mes.task.manager.iface;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.mes.basicdata.domain.Operation;
import com.mes.basicdata.domain.Part;
import com.mes.common.manager.iface.IBasicManager;
import com.mes.task.domain.OperationTask;
import com.mes.task.domain.PartTask;

public interface IPartTaskManager extends IBasicManager<PartTask> {

	/**
	 * 判断一个零件任务是否完成 如果最后一道工序完成，自动完成该批零件任务 如果最后一道检验工序完成，也自动完成该批次零件任务
	 * 
	 * @param partTaskUid
	 * @return
	 */
	public boolean isPartTaskFinish(String partTaskUid);

//	/*
//	 * 悬挂零件任务
//	 */
//	public void suspendParttask(String partUid) throws Exception;
//
//	/*
//	 * 恢复悬挂中的零件任务
//	 */
//	public void resumeParttask(String partUid) throws Exception;
//
//	public void updateParttaskPriority(String partUid) throws Exception;
//
//	public List<PartTask> getPartTasksOnPriority(Map<String, Object> parameters, int type) throws Exception;
//
//	public Map<String, Integer> getPartTaskCountOnPriority(Map<String, Object> parameters, int type) throws Exception;
//
//	public PartTask getPartTask(String partUid, String batchNum) throws Exception;
//
//	/*
//	 * 零件任务下发
//	 */
//	public void releasePartTask(String taskUid) throws Exception;
//
//	/*
//	 * 零件任务取消下发
//	 */
//	public void cancelReleasePartTask(String taskUid) throws Exception;
//
//	/*
//	 * 
//	 * 零件任务强制设置优先级
//	 */
//	public void forcePriority(String taskUid, int priority) throws Exception;
//
//	public String getNetChartXml(String partUid) throws Exception;
//
//	public String getSumNetChartXml(String partUid) throws Exception;

	/**
	 * 交付零件任务
	 * @param partTaskUid 零件任务唯一号
	 * @param deliveryQty 交付数量
	 * @throws Exception
	 */
	public void delivery(String partTaskUid, float deliveryQty) throws Exception;

//	/**
//	 * 更新零件任务交货期,并同步到调度系统的事件中
//	 */
//
//	public void updatePartTaskLateFinish(PartTask partTask, Date newLateFinish) throws Exception;
//
//	/**
//	 * 更新零件任务计划信息，包括交货期，关键等级等,并同步到调度系统的事件中
//	 */
//	public void syncPartTaskPlanInfo(PartTask partTask) throws Exception;
//
//	/*
//	 * 零件任务开始暂停
//	 */
//	public void pausePartTask(String taskUid) throws Exception;
//
//	/*
//	 * 零件任务暂停恢复
//	 */
//	public void resumePausedPartTask(String taskUid) throws Exception;

	/**
	 * 设置某一零件任务为完成，如果已经完成，则直接退出
	 * 
	 * @param partTask
	 */
	public void finishPartTask(PartTask partTask) throws Exception;

	/**
	 * 设置某一零件任务为完成
	 * 
	 * @param taskUid
	 */
	public void finishPartTask(String taskUid) throws Exception;

	/**
	 * 将零件任务设置为开始
	 * @param partTask
	 */
	public void startPartTask(PartTask partTask) throws Exception;
	
	/**
	 * 将零件任务设置为开始
	 * @param partTaskUid
	 * @throws Exception
	 */
	public void startPartTask(String partTaskUid) throws Exception;

//	/**
//	 * 刷新一个零件任务的工序距离 同时设置当前工序
//	 * 
//	 * @param partTaskUid
//	 * 
//	 */
//	public void refreshTaskDistance(String partTaskUid);
//
//	/**
//	 * 返回某一个零件任务的当前工序任务 如果当前任务为空，则重新进行计算当前工序任务
//	 * 
//	 * @param OperationTask
//	 * @return
//	 */
//	public OperationTask getCurrentOperationTask(PartTask partTask);
//
//	public void operationTaskBreak(String taskUid) throws Exception;

	/**
	 * 修改零件任务在制数量， 增加修改日志功能 如果在制数量减少，自动扣除与其关联的指令链接
	 * 
	 * @param taskUid
	 * @param planQty
	 */
	public void updatePlanQty(String taskUid, Float planQty) throws Exception;

//	double calDemandLinkQty(PartTask partTask);
//
//	public void saveTaskAndLink(PartTask partTask, String demandUid) throws Exception;
//
//	@Deprecated
//	public Set<Operation> getKeyOperationInfo(String partUid) throws Exception;
//
//	/**
//	 * 获取全年计划相关信息
//	 */
//	@Deprecated
//	public Part getPartInfo(Part part) throws Exception;

//
//	/**
//	 * 删除零件任务计划
//	 * 
//	 * @param taskUid
//	 * @throws Exception
//	 */
//	public void deletePartTask(String taskUid) throws Exception;

	/**
	 * 零件任务取消 operator 操作者 cancelReason 取消原因
	 * @param taskUid
	 * @param operator
	 * @param cancelReason
	 * @throws Exception
	 */
	public void cancelPartTask(String taskUid, String operator, String cancelReason) throws Exception;
	
	/**
	 * 整批零件任务报废处理
	 * 
	 * @param taskUid
	 * @throws Exception
	 */
	public void rejectPartTask(String taskUid) throws Exception;

//	/**
//	 * 删除零件任务计划
//	 * 
//	 * @param taskUid
//	 * @throws Exception
//	 */
//	public void deletePartTask(PartTask partTask) throws Exception;
//
//	/**
//	 * 刷新一个零件任务的工序距离 同时设置当前工序
//	 * 
//	 * @param partTaskUid
//	 */
//	/**
//	 * 装配任务级联分解，产生其相关的子件装配任务
//	 * 
//	 * @param taskUid
//	 * @throws Exception
//	 */
//	public void taskBreak(String taskUid) throws Exception;
//
//	/**
//	 * 取得一个零组件任务所有的未完成任务
//	 * 
//	 * @param partUid
//	 * @param batchNum
//	 * @return
//	 * @throws Exception
//	 */
//	public List<PartTask> getWipPartTaskCascade(PartTask partTask) throws Exception;
//
//	/**
//	 * 根据零件part_number获得该零组件的零组件任务以及该零组件的所有前置零组件任务
//	 * 
//	 * @author ChanLueng
//	 * @param partUid
//	 * @return
//	 * @throws Exception
//	 */
//	public String getPartTasksNetChartXml(String partUid) throws Exception;

	
}
